<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        /*
            所有任务分为宏任务（macrotask )和微任务(microtask )两种。
                - MacroTask(宏任务):* script全部代码、setTimeout、setInterva1、I/0、UI Rendering。
                - MicroTask（微任务）:* Process.nextTick (Node独有)、Promise. . .
                在挂起任务时，JS引擎会将所有任务按照类别分到这两个队列中，首先在宏任务的队列中取出第一个任务，执行完毕取出微任务队列中的所有任务顺序执行;之后新的事件循环开始，取宏任务的第一个，周而复始，直至两个队列的任务都取完。

            	解析：结合上面的知识，所有的script代码其实都是一个宏任务，所以我们分析题目时要这样看：
	                首先整段代码都是一个宏任务，然后执行这个宏任务，得到了script start、script end两个同步任务、一个time over定时器宏任务、promise1 promise2两个微任务。那么这个整段代码所组成的宏任务就执行完了，结果就是打印script start和script end、开启定时器、promise.resolve()快速拿到了一个成功的promise实例。
	                现在开始看微任务队列里有没有能执行的微任务，很明显刚才讲的promise1和promise2就是可执行的微任务，所以打印他们两个，紧接着就是继续返回开启新的宏任务，这样定时器里的time over就被打印了。
        */ 

        // script start, script end, promise1, promise2, time over
        console.log('script start');

        setTimeout(() => {
            console.log('time over');
        }, 0);

        Promise.resolve().then(() => {
            console.log('promise1');
        }).then(() => {
            console.log('promise2');
        });

        console.log('script end');
        
    </script>
</body>

</html>